package org.huangrui.controller;

import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.huangrui.func.RecruitServiceFunction;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.model.tool.ToolCallingChatOptions;
import org.springframework.ai.support.ToolCallbacks;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Author hr
 * @Create 2025-11-11 23:42
 **/
@Slf4j
@RestController
public class ChatController {
    // 有两个模型，dashscopeChatModel 和 openaiChatModel
    @Resource(name = "dashscopeChatModel")
    private ChatModel chatModel;
    @Autowired
    private VectorStore vectorStore;
    // http://localhost:8006/ai/agent
     @GetMapping("/ai/agent")
    public String agent(@RequestParam(value = "query", defaultValue = "张三") String query) {
         //检索
         List<Document> documents = vectorStore.similaritySearch(query);
         String info = "";
         if (documents.size() > 0){
             info = documents.get(0).getText();
         }
         //构造系统 prompt
         String systemPrompt= """
            角色与目标：你是一个招聘助手，会针对用户的问题，结合候选人经历，岗位匹配度等专业知识，给用户提供指导。
            指导原则：你需要确保给出的建议合理科学，不会对候选人的表现有言论侮辱。
            限制：在提供建议时，需要强调在个性建议方面用户仍然需要线下寻求专业咨询。
            澄清：在与用户交互过程中，你需要明确回答用户关于招聘方面的问题，对于非招聘方面的问题，你的回应是‘我只是一个招聘助手，不能回答这个问题哦’。
            个性化：在回答时，你需要以专业可靠的预期回答，偶尔可以带点幽默感。调节气氛。
            给你提供一个数据参考，并且给你调用岗位投递检索公户
            请你跟进数据参考与工具返回结果回复用户的请求。
            """;
         //构造用户 prompt
         String userPrompt= """
            给你提供一些数据参考：{info},请回答我的问题：{query}。
            请你跟进数据参考与工具返回结果回复用户的请求。
            """;
         SystemMessage systemMessage = new SystemMessage(systemPrompt);
         PromptTemplate promptTemplate = new PromptTemplate(userPrompt);
         Message userMessage = promptTemplate.createMessage(Map.of("info", Objects.requireNonNull(info), "query", query));

         ToolCallback[] toolCallbacks = ToolCallbacks.from(new RecruitServiceFunction());

         Prompt prompt = new Prompt(List.of(userMessage,systemMessage),
                 ToolCallingChatOptions.builder().toolCallbacks(toolCallbacks).build()
         );
         //调用
         List<Generation> results = chatModel.call(prompt).getResults();
         String collect = results.stream().map(x -> x.getOutput().getText()).collect(Collectors.joining());
         log.info("结果：{}", collect);
         return collect;
     }
}
